Codeforces Round 863 (Div. 3)

您所在的位置:网站首页 long int 和long Codeforces Round 863 (Div. 3)

Codeforces Round 863 (Div. 3)

2023-04-06 22:44| 来源: 网络整理| 查看: 265

这场的题目的质量真的超好!(真的是把我打傻了qwq)

A Insert Digit

题意:给定一个正整数和一个额外的数字d(0 \leq ​ d \leq ​ 9),将d插入到这个正整数中并使其结果尽可能大。

解法:从左到右遍历这个正整数的每一位,找到第一个小于d的位置,将其插入到该位置前面即可,如果找不到就将d放到最后。

#include ​ using namespace std; ​ typedef long long ll; typedef pair pii; ​ #define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr) #define cf(_) int _;cin >> _;while(_--) ​ int main() { IOS; cf(_) { int n,t; string s; cin >> n >> t >> s; string res; bool ok = false; for(int i = 0;i

解法:

这题还是挺思维的。将每个传送带看成每一层,将传送带上的点都映射到最左下角,然后层数之差的绝对值即为最终答案。

故问题转为如何找到这个最左下角的位置,由于对称性,对于任意一个点(x,y),其关于两个对角线对称后的其余三个点分别为:(y,x),(n - x + 1,n - y + 1),(n - y + 1,n - x + 1),则最左下角的坐标即为min({x,y,n - x + 1,n - y + 1}),代码如下:

#include ​ using namespace std; ​ void solve() { int n,x1,y1,x2,y2; cin >> n >> x1 >> y1 >> x2 >> y2; ​ cout sync_with_stdio(false); ​ int t; cin >> t; ​ while(t--) solve(); ​ return 0; } C Restore the Array

题意:已知长度为n - 1的数组b,其中: b_i=max(a_i,a_{i+1})b_i=max(a_i,a_{i+1}) (1 ≤ i ≤ n − 1) ​。保证给定的数组b合法,请还原数组a满足上式,输出任意解即可。

解法:模拟去放的过程,先将a数组的最后两个数初始化为b[n - 1],从后往前跑一遍:如果当前位的b数组大于后一位的a数组,则直接将该位赋值为​即可;否则如果较小的话,则同时将当前位和后一位赋值为​(因为保证有解)。

#include ​ using namespace std; ​ void solve() { int n; cin >> n; ​ vector b(n + 1),a(n + 1); for(int i = 1;i > b[i]; a[n] = a[n - 1] = b[n - 1]; for(int i = n - 2;i >= 1;i--) { if(b[i] >= a[i + 1]) a[i] = b[i]; else a[i] = a[i + 1] = b[i]; } ​ for(int i = 1;i sync_with_stdio(false); ​ int t; cin >> t; ​ while(t--) solve(); ​ return 0; } D Umka and a Long Flight

题意: 给定一个长为F[n + 1],宽为F[n]的斐波那契矩形,你需要将这个矩阵分成n + 1个正方形,并满足:

1、已知被涂色的(x,y)小正方形方格的边长为1。

2、最多有两个正方形边长相等。

3、边长为斐波那契数。

解法:

显然,边长为1的小方格一定要用2个,剩下的就是用2,3,...n阶的斐波那契数去拼凑。

那么我们可以贪心地从大的开始放,假设给定的边长为1的小方格是如下黑色方格,则:

1、如果黑色小方格所处位置比矩形的宽F[n]大,则可以将左边的大方格切掉(边长为F[n]),剩余右边部分翻转一下(使其长在水平方向,宽在竖直方向),那么黑色方格的坐标需要进行变换:(x,y) -> (F[n + 1] - y + 1,x)。

2、如果黑色小方格所处位置比F[n - 1](要切去的右边大正方形边长为矩形的宽F[n],则左侧剩余部分长度就是F[n + 1] - F[n] = F[n - 1],即由斐波那契公式得出)要小,即黑色方格在大方格的左边,则“切掉”右边的大方格,并将左边剩余部分翻转一下(使其长在水平方向,宽在竖直方向),那么黑色方格的坐标就需要进行变换:由(x,y)-> (y,x)。

依次递归下去即可,代码如下:

#include ​ using namespace std; ​ int F[50]; ​ void init() { F[0] = F[1] = 1; for(int i = 2;i > n >> x >> y; ​ function dfs = [&](int n,int x,int y) -> bool { if(!n) return true; if(y > F[n]) return dfs(n - 1,F[n + 1] - y + 1,x); else if(y sync_with_stdio(false); ​ init(); // for(int i = 1;i n; ll l = 1,r = 1e18; while (l > 1; if(dp(mid) >= n) r = mid; else l = mid + 1; } cout > n; ​ vector a; while (n) { a.push_back(n % 9); n /= 9; } ​ for(int i = a.size() - 1;i >= 0;i--) cout sync_with_stdio(false); ​ int t; cin >> t; ​ while(t--) solve(); ​ return 0; }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3